package com.zw.a.basic.a13.demo06_synchronized_method;


//案例: 演示同步方法的锁对象分别是谁.
/*
    结论: 记忆
        同步代码块:
            1. 锁对象可以是任意的对象.
            2. 必须使用同一把锁, 否则可能出现锁不住的情况.
        同步方法:
            静态同步方法:	当前类的字节码文件对象
            非静态同步方法: this

	测试思路:
	    1. 定义一个普通类(Demo), 该类中有两个方法: show1(), show2();
	    2. 在测试类(Test)中, 创建两个线程, 分别调用Demo#show1(), Demo#show2()方法.
	    3. 为了让效果更明显, 我们要加入死循环, 此时会发现, 打印结果是乱序的.
	    4. 为了解决乱序(线程安全)问题, 我们用同步方法和同步代码块改进.
	        即: show1()方法用 同步代码块 实现, 我们能看到锁是谁.
	            show2()方法用 同步方法   实现, 我们看不到锁是谁.
	    5. 如果此时, 程序打印结果不乱码, 说明 两个方法用的锁是同一把锁, 从而得到我们的结论

	 大白话翻译:
	    1. show1()和show2()方法打印结果不乱吗, 说明   show1()的锁  等于  show2()方法的锁.
	    2. 因为show1()的锁可见, 从而能得到 show2()方法的锁.
 */
public class Test {
    public static void main(String[] args) {
        //1. 创建Demo类型的对象
        Demo d = new Demo();

        //2. 一个线程通过whie(true)调用 Demo#show1()
        new Thread() {
            @Override
            public void run() {
                //通过whie(true)调用 Demo#show1()
                while (true)
                    d.show1();
            }
        }.start();

        //3. 一个线程通过whie(true)调用 Demo#show2()
        new Thread() {
            @Override
            public void run() {
                //通过whie(true)调用 Demo#show2()
                while (true)
                    d.show2();
            }
        }.start();
    }
}
